static short_handle mkshort_handle;
static preferred_posn_type posn_type;
static struct tm tm;
-static waypoint * curr_waypt = NULL;
-static waypoint * last_waypt = NULL;
+static waypoint *curr_waypt;
+static waypoint *last_waypt;
static void * gbser_handle;
static const char *posn_fname;
static queue pcmpt_head;
static const double kts2mps =0.51444444444444444; /* knots to m/s */
static const double kmh2mps =0.27777777777777778; /* km/h to m/s */
-static char *dogprmc = NULL;
-static char *dogpgga = NULL;
-static char *dogpvtg = NULL;
-static char *dogpgsa = NULL;
-static char *snlenopt = NULL;
-static char *optdate = NULL;
-static char *getposnarg = NULL;
-static char *opt_sleep = NULL;
-static char *opt_baud = NULL;
-static char *opt_append = NULL;
-static long sleepus = 0;
+static char *opt_gprmc;
+static char *opt_gpgga;
+static char *opt_gpvtg;
+static char *opt_gpgsa;
+static char *snlenopt;
+static char *optdate;
+static char *getposnarg;
+static char *opt_sleep;
+static char *opt_baud;
+static char *opt_append;
+
+static long sleepus;
static int getposn;
static int append_output;
-static time_t last_time = -1;
+static time_t last_time;
static double last_read_time; /* Last timestamp of GGA or PRMC */
static waypoint * nmea_rd_posn(posn_status *);
arglist_t nmea_args[] = {
{"snlen", &snlenopt, "Max length of waypoint name to write", "6", ARGTYPE_INT, "1", "64" },
- {"gprmc", &dogprmc, "Read/write GPRMC sentences", "1", ARGTYPE_BOOL, ARG_NOMINMAX },
- {"gpgga", &dogpgga, "Read/write GPGGA sentences", "1", ARGTYPE_BOOL, ARG_NOMINMAX },
- {"gpvtg", &dogpvtg, "Read/write GPVTG sentences", "1", ARGTYPE_BOOL, ARG_NOMINMAX },
- {"gpgsa", &dogpgsa, "Read/write GPGSA sentences", "1", ARGTYPE_BOOL, ARG_NOMINMAX },
+ {"gprmc", &opt_gprmc, "Read/write GPRMC sentences", "1", ARGTYPE_BOOL, ARG_NOMINMAX },
+ {"gpgga", &opt_gpgga, "Read/write GPGGA sentences", "1", ARGTYPE_BOOL, ARG_NOMINMAX },
+ {"gpvtg", &opt_gpvtg, "Read/write GPVTG sentences", "1", ARGTYPE_BOOL, ARG_NOMINMAX },
+ {"gpgsa", &opt_gpgsa, "Read/write GPGSA sentences", "1", ARGTYPE_BOOL, ARG_NOMINMAX },
{"date", &optdate, "Complete date-free tracks with given date (YYYYMMDD).", NULL, ARGTYPE_INT, ARG_NOMINMAX },
{ "get_posn", &getposnarg, "Return current position as a waypoint",
NULL, ARGTYPE_BOOL, ARG_NOMINMAX},
ARG_TERMINATOR
};
+#define CHECK_BOOL(a) if (a && (*a == '0')) a = NULL
+
/*
* Slightly different than the Magellan checksum fn.
*/
{
curr_waypt = NULL;
last_waypt = NULL;
+ last_time = -1;
+
+ CHECK_BOOL(opt_gprmc);
+ CHECK_BOOL(opt_gpgga);
+ CHECK_BOOL(opt_gpvtg);
+ CHECK_BOOL(opt_gpgsa);
+
QUEUE_INIT(&pcmpt_head);
if (getposnarg) {
static void
nmea_wr_init(const char *portname)
{
+ CHECK_BOOL(opt_gprmc);
+ CHECK_BOOL(opt_gpgga);
+ CHECK_BOOL(opt_gpvtg);
+ CHECK_BOOL(opt_gpgsa);
+
append_output = atoi(opt_append);
file_out = gbfopen(portname, append_output ? "a+" : "w+", MYNAME);
+ sleepus = -1;
if ( opt_sleep ) {
if ( *opt_sleep ) {
sleepus = 1e6 * atof(opt_sleep);
if (0 == strncmp(tbuf, "$GPWPL,", 7)) {
gpwpl_parse(tbuf);
} else
- if (dogpgga && (0 == strncmp(tbuf, "$GPGGA,", 7))) {
+ if (opt_gpgga && (0 == strncmp(tbuf, "$GPGGA,", 7))) {
posn_type = gpgga;
gpgga_parse(tbuf);
} else
- if (dogprmc && (0 == strncmp(tbuf, "$GPRMC,", 7))) {
+ if (opt_gprmc && (0 == strncmp(tbuf, "$GPRMC,", 7))) {
if (posn_type != gpgga) {
posn_type = gprmc;
}
if (0 == strncmp(tbuf, "$PCMPT,", 7)) {
pcmpt_parse(tbuf);
} else
- if (dogpvtg && (0 == strncmp(tbuf, "$GPVTG,",7))) {
+ if (opt_gpvtg && (0 == strncmp(tbuf, "$GPVTG,",7))) {
gpvtg_parse(tbuf); /* speed and course */
} else
- if (dogpgsa && (0 == strncmp(tbuf, "$GPGSA,",7))) {
+ if (opt_gpgsa && (0 == strncmp(tbuf, "$GPGSA,",7))) {
gpgsa_parse(tbuf); /* GPS fix */
}
fix='0';
}
- if (dogprmc) {
+ if (opt_gprmc) {
snprintf(obuf, sizeof(obuf), "GPRMC,%06d,%c,%08.3f,%c,%09.3f,%c,%.2f,%.2f,%06d,,",
(int) hms,
fix=='0' ? 'V' : 'A',
cksum = nmea_cksum(obuf);
gbfprintf(file_out, "$%s*%02X\n", obuf, cksum);
}
- if (dogpgga) {
+ if (opt_gpgga) {
snprintf(obuf, sizeof(obuf), "GPGGA,%06d,%08.3f,%c,%09.3f,%c,%c,%02d,%.1f,%.3f,M,0.0,M,,",
(int) hms,
fabs(lat), lat < 0 ? 'S' : 'N',
cksum = nmea_cksum(obuf);
gbfprintf(file_out, "$%s*%02X\n", obuf, cksum);
}
- if ((dogpvtg) && ((wpt->course>=0) || (wpt->speed>0))) {
+ if ((opt_gpvtg) && ((wpt->course>=0) || (wpt->speed>0))) {
snprintf(obuf,sizeof(obuf),"GPVTG,%.3f,T,0,M,%.3f,N,%.3f,K",
(wpt->course>=0)?(wpt->course):(0),
(wpt->speed>0)?(wpt->speed / kts2mps):(0),
gbfprintf(file_out, "$%s*%02X\n", obuf, cksum);
}
- if ((dogpgsa) && (wpt->fix!=fix_unknown)) {
+ if ((opt_gpgsa) && (wpt->fix!=fix_unknown)) {
switch (wpt->fix)
{